package oprdracht2;

import java.util.Scanner;
import ui.OthelloUserInterface;
import ui.UIHulpMethodes;
import ui.UserInterfaceFactory;
import ui.Event;

public class Orthello {

	OthelloUserInterface ui;
	private BeurtRij beurtRij;
	private BordRij bordRij;
	private final static int MAX_AANTAL_BEURTEN = 120;
	private final static int HOOGTE = 8;
	private final static int BREEDTE= 8;
	private int huidigeBeurt;
	Orthello(){
		UserInterfaceFactory.zetLageResolutie(true);
		beurtRij = new BeurtRij(MAX_AANTAL_BEURTEN);
		bordRij = new BordRij(MAX_AANTAL_BEURTEN);
		ui = UserInterfaceFactory.geefOthelloUI();
		UIHulpMethodes.vraagGebruikerOmInvoer();
	}
	
	public Bord geefBeginBord(){
		Bord beginBord = new Bord(BREEDTE,HOOGTE);
		beginBord.voegToe(3, 3, ui.WIT);
		beginBord.voegToe(4, 4, ui.WIT);
		beginBord.voegToe(3, 4, ui.ZWART);
		beginBord.voegToe(4, 3, ui.ZWART);
		return beginBord;
	}
	
	public Bord plaatsCoordinaatRijOpBord(Bord bord,CoordinaatRij coordinaatRij,int kleur){
		for(int i = 0;i < coordinaatRij.geefAantalCoordinaten();i++){
			bord.voegToe(coordinaatRij.geefCoordinaten()[i], kleur);
		}
		return bord;
	}
	
	public Bord plaatsZetOpBord(Bord bord,Zet zet,int kleur){
		bord.voegToe(zet.geefZetCoordinaat(), kleur);
		bord = plaatsCoordinaatRijOpBord(bord,zet.geefVeranderdeStenen(),kleur);
		
		
		return bord;
	}
	
	public Bord plaatsBeurtOpBord(Bord bord, int zetNummer){
		Beurt beurt = beurtRij.geefBeurt(zetNummer);
		if(beurt.geefZet()){
			bord = plaatsZetOpBord(bord,beurt.geefZetInhoud(),geefKleur(beurt));
		}
		return bord;
	}
	
	public void verwerkInvoerTotBordRij(){
		bordRij.voegToe(geefBeginBord());
		for(int i = 0;i < beurtRij.geefHuidigAantalBeurten();i++){
			bordRij.kopieerBord(i, i + 1);
			bordRij.voegToe(plaatsBeurtOpBord(bordRij.geefBord(i + 1),i));
		}
		
	}
	
	public void laatBordZien(Bord bord){
		ui.maakLeeg();
		for(int i = 0;i < bord.geefLengte();i++){
			for(int j = 0;j < bord.geefHoogte();j++){
				ui.plaats(i, j, bord.geefWaarde(i, j));
			}
		}
		ui.toon();
	}
	
	public int geefKleur(Beurt beurt){
	
		//in 1 regel
		if(beurt.geefWit()){
			return ui.WIT;
		} else {
			return ui.ZWART;
		}
	}
	
	public int geefInverseKleur(Beurt beurt){
		
		//in 1 regel
		if(beurt.geefWit()){
			return ui.ZWART;
		} else {
			return ui.WIT;
		}
	}
	
	
	

	public void verwerkCijfer(Event event){
		if(huidigeBeurt < beurtRij.geefHuidigAantalBeurten() - Integer.parseInt(event.data)){
			laatBordZien(bordRij.geefBord(huidigeBeurt + Integer.parseInt(event.data)));
			huidigeBeurt += Integer.parseInt(event.data);
		}
	}
	
	public void verwerkAltCijfer(int nummer){
		if(huidigeBeurt > 0 + nummer){
			laatBordZien(bordRij.geefBord(huidigeBeurt - nummer));
			huidigeBeurt -= nummer;
		}
	}
	
	public void verwerkLetter(Event event){
		if(event.data.equals("z") && huidigeBeurt <= beurtRij.geefHuidigAantalBeurten()){
			laatBordZien(bordRij.geefBord(huidigeBeurt));
			huidigeBeurt += 1;
		} else if (event.data.equals("x") && huidigeBeurt > 1){
			laatBordZien(bordRij.geefBord(huidigeBeurt - 2));
			huidigeBeurt -= 1;
		} else if (event.data.equals("a") || event.data.equals("b") || event.data.equals("c") || event.data.equals("d") || event.data.equals("e") || event.data.equals("f") || event.data.equals("g") || event.data.equals("h") || event.data.equals("i")){
			int nummer = (event.data.charAt(0) - 'a' + 1);
			verwerkAltCijfer(nummer);
		}
		
	}
	
	public void verwerkEvent(Event event){
		if(event.naam.equals("letter")){
			verwerkLetter(event);
		} else if (event.naam.equals("alt_cijfer")){
			//verwerkAltCijfer(event);
		} else if (event.naam.equals("cijfer")){
			verwerkCijfer(event);
		}
		
	}

	public void wachtOpInvoer(){
		while(true){
			Event event = ui.geefEvent();
			verwerkEvent(event);
		}
	}

	public boolean leesZet(String input){
		return input.contains("zet");
	}

	public boolean leesWitOfZwart(String input){
		return input.contains("wit");
	}

	public Coordinaat leesCoordinaat(char letter,int cijfer){
		letter -= 'a';
		return new Coordinaat(letter,cijfer -1);
	}

	public Zet leesBeurt(Scanner regel){
		Coordinaat zetCoordinaat = leesCoordinaat(regel.next().charAt(0),regel.nextInt());
		CoordinaatRij coordinaatRij = new CoordinaatRij(HOOGTE * BREEDTE);
		while(regel.hasNext()){
			coordinaatRij.voegToe(leesCoordinaat(regel.next().charAt(0),regel.nextInt()));
		}
		return new Zet(zetCoordinaat,coordinaatRij);
	}
	
	public void leesRegel(String input){
		Scanner regel = new Scanner(input);
			boolean wit = leesWitOfZwart(regel.next());
			int denkTijd = regel.nextInt();
			boolean zet = leesZet(regel.next());				
			if(zet){
				beurtRij.voegBeurtToe(new Beurt(zet,wit,denkTijd,leesBeurt(regel)));
			} else{
				beurtRij.voegBeurtToe(new Beurt(zet,wit,denkTijd));
			}
	}
	public void leesBestand(Scanner in){
		while(in.hasNext()){
			leesRegel(in.nextLine());
		}
	}

	public void initialiseerBord(){
		laatBordZien(bordRij.geefBord(0));

	}

	public void start(){
		Scanner in = new Scanner(System.in);
		leesBestand(in);
		verwerkInvoerTotBordRij();
		initialiseerBord();
		wachtOpInvoer();

	}
	public static void main(String[] argv) {
		new Orthello().start();
	}

}
